/*
 * 功能：评论服务类，提供评论相关的业务逻辑操作
 * 作者：张杨(Sunny)
 * 日期： 2024/11/21 下午2:02
 */
package com.example.springboot.service;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.springboot.common.Result;
import com.example.springboot.entity.Comment;
import com.example.springboot.entity.User;
import com.example.springboot.mapper.CommentMapper;
import com.example.springboot.utils.TokenUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;


@Service
public class CommentService extends ServiceImpl<CommentMapper, Comment> {

    @Resource
    CommentMapper commentMapper;


    /**
     * 创建评论，自动填充当前用户信息。
     *
     * @param comment 评论对象
     * @return 操作结果
     */
    public Result createComment(Comment comment) {
        // 获取当前登录用户
        User currentUser = TokenUtils.getCurrentUser();
        if (currentUser == null) {
            return Result.error("用户未登录");
        }
        if (comment == null) {
            return Result.error("评论内容不能为空");
        }
        // 设置评论信息
        comment.setUsername(currentUser.getUsername()); // 设置评论用户名
        comment.setAvatar(currentUser.getAvatar()); // 设置评论用户头像
        comment.setCreateTime(DateUtil.today()); // 设置评论创建时间为今天
        commentMapper.insert(comment);
        return Result.success("评论发布成功");
    }


    /**
     * 查询自己发布的评论
     *
     * @return 评论列表
     */
    public List<Comment> selectSelfComments() {
        User currentUser = TokenUtils.getCurrentUser();  // 获取到当前登录的用户信息
        if (currentUser == null) {
            // 处理未登录的情况，例如返回空列表或者抛出异常
            return Collections.emptyList(); // 或者抛出异常，例如 throw new UnauthorizedException("用户未登录");
        }
        QueryWrapper<Comment> queryWrapper = new QueryWrapper<Comment>().orderByDesc("createTime");
        queryWrapper.eq("username", currentUser.getUsername());
        return commentMapper.selectList(queryWrapper);
    }


    /**
     * 查询开放的评论
     *
     * @return 返回开放的评论列表
     */
    public List<Comment> selectOpenComments() {
        QueryWrapper<Comment> queryWrapper = new QueryWrapper<Comment>().orderByDesc("createTime");
        queryWrapper.eq("open", 1);
        return commentMapper.selectList(queryWrapper);
    }


    /**
     * 分页查询评论信息，支持按标题、用户名、创建时间、内容、教练和评分进行筛选
     *
     * @param pageNum    当前页码
     * @param pageSize   每页显示的记录数
     * @param title      标题（模糊查询）
     * @param username   用户名（精确查询）
     * @param createTime 创建时间（模糊查询）
     * @param content    内容（模糊查询）
     * @param coach      教练（模糊查询）
     * @param score      评分（模糊查询）
     * @return 返回分页查询结果
     */
    public Page<Comment> selectByPage(Integer pageNum, Integer pageSize, String title, String username, String createTime, String content, String coach, String score) {
        QueryWrapper<Comment> queryWrapper = new QueryWrapper<Comment>().orderByDesc("createTime");
        queryWrapper.like(StrUtil.isNotBlank(title), "title", title);
        queryWrapper.eq(StrUtil.isNotBlank(username), "username", username);
        queryWrapper.like(StrUtil.isNotBlank(createTime), "createTime", createTime);
        queryWrapper.like(StrUtil.isNotBlank(coach), "coach", coach);
        queryWrapper.like(StrUtil.isNotBlank(content), "content", content);
        queryWrapper.like(StrUtil.isNotBlank(score), "score", score);
        return commentMapper.selectPage(new Page<>(pageNum, pageSize), queryWrapper);
    }


    /**
     * 导出评论信息到Excel文件
     *
     * @param username   用户名（模糊查询）
     * @param createTime 创建时间（模糊查询）
     * @param ids        评论ID列表（精确查询）
     * @param response   HTTP响应对象
     * @throws IOException 如果IO操作失败
     */
    public void exportData(String username, String createTime, String ids, HttpServletResponse response) throws IOException {
        ExcelWriter writer = ExcelUtil.getWriter(true); // 创建Excel写入器
        List<Comment> list; // 用于存储查询结果的列表
        QueryWrapper<Comment> queryWrapper = new QueryWrapper<>(); // 创建查询条件包装器

        // 如果ids参数不为空，则按ID筛选数据
        if (StrUtil.isNotBlank(ids)) {
            List<Integer> idsArr1 = Arrays.stream(ids.split(",")).map(Integer::valueOf).collect(Collectors.toList());
            queryWrapper.in("id", idsArr1);
        } else {
            // 否则按用户名或创建时间筛选数据
            queryWrapper.like(StrUtil.isNotBlank(username), "username", username);
            queryWrapper.like(StrUtil.isNotBlank(createTime), "createTime", createTime);
        }
        list = commentMapper.selectList(queryWrapper); // 执行查询
        writer.write(list, true); // 将查询结果写入Excel

        // 设置响应头，指定文件类型和文件名
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename="
                + URLEncoder.encode("评论信息表", "UTF-8") + ".xlsx");

        ServletOutputStream outputStream = response.getOutputStream(); // 获取响应输出流
        writer.flush(outputStream, true); // 将Excel数据刷新到输出流
        writer.close(); // 关闭写入器
        outputStream.flush(); // 刷新输出流
        outputStream.close(); // 关闭输出流
    }
}
